“Baby Mental Life: Study 2” was conducted on MTurk on 2018-08-04.

Our planned sample was 300 participants, and we anticipated that roughly 80% of recruited participants would pass all of our attention checks, so we initially recruited 378 participants (on the idea that ~80% of 378 ~ 300 participants; note that for administrative purposes we need to recuit participants in batches that were divisible by 9). After filtering out participants who failed at least one of our attention checks, we ended up retaining fewer than 300 participants, so we recruited an additional 16 participants for a total of 394 people recruited. At each stage, we recruited women and men through separate studies, in hopes of acquiring a roughly equal split between genders.

In the end, we ended up with a sample of 304 participants who passed our attention checks, 237 of whom came from unique GPS coordinates.

For this first pass, these data exclude participants where there is another participant with an identical set of GPS coordinates as recorded by Qualtrics.

Each participant assessed children’s mental capacities at 13 target ages between the ages of 0 and 5 years. For each target, they rated 20 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable).

For more details about the study, see our preregistration here.

Here we run some exploratory analyses on these data.

# load required libraries
library(tidyverse)
library(langcog) # source: https://github.com/langcog/langcog-package
library(psych)
library(lme4)
# set theme for ggplots
theme_set(theme_bw())
# run source code (extra home-made functions)
source("./scripts/max_factors_efa.R")
source("./scripts/plot_fun.R")
source("./scripts/reten_fun.R")
source("./scripts/table_fun.R")
source("./scripts/data_prep.R")
NAs introduced by coercionattributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"

Treating factors as categories

Preliminaries

First, I’ll do the factor analysis, and get a list of the top 5 items by factor:

# load in S1 efa in case we need it
efa_S1 <- readRDS("../study 1/s1_efa.rds")
demo_S1 <- read.csv("../study 1/s1_demo.csv")
# conduct S2 efa
efa_S2 <- fa(d_all, nfactors = 4, rotate = "oblimin", fm = "minres",
             scores = "tenBerge", impute = "median")
Loading required namespace: GPArotation
table_fun(efa_S2, num_items = 5, pos_abs = "abs")
capacity loading
Factor 1
feeling_distressed 0.82
feeling_overwhelmed 0.82
feeling_frustrated 0.78
feeling_helpless 0.76
feeling_lonely 0.60
Factor 2
having_self_control 0.96
controlling_their_emotions 0.93
telling_right_from_wrong 0.93
planning 0.89
reasoning_about_things 0.89
Factor 3
getting_hungry 0.83
feeling_pain 0.79
feeling_tired 0.67
hearing_sounds 0.58
feeling_physically_uncomfortable 0.49
Factor 4
feeling_happy 0.82
finding_something_funny 0.81
feeling_excited 0.79
loving_somebody 0.64
learning_from_other_people 0.51

Now I’ll use this to define categories of mental capacities:

# get items by factor
factors_S2 <- efa_S2$loadings[] %>%
  data.frame() %>%
  rownames_to_column("capacity") %>%
  gather(factor, loading, -capacity) %>%
  group_by(capacity) %>%
  top_n(1, loading) %>%
  ungroup() %>%
  select(-loading) %>%
  mutate(factor_names = recode_factor(factor,
                                      "MR1" = "Negative emotions",
                                      "MR2" = "Cognition & control",
                                      "MR3" = "Bodily sensations",
                                      "MR4" = "Positive/social emotions"),
         factor = factor(factor))
# make new dataframe
d_cat <- d_all %>%
  rownames_to_column("subid_target") %>%
  mutate(subid = gsub("_.*$", "", subid_target),
         target = gsub("^.*_", "", subid_target)) %>%
  select(-subid_target) %>%
  mutate(target_num = recode(target,
                             "target00mo" = 0,
                             "target0Xmo" = 4/30,
                             "target01mo" = 1,
                             "target02mo" = 2,
                             "target04mo" = 4,
                             "target06mo" = 6,
                             "target09mo" = 9,
                             "target12mo" = 12,
                             "target18mo" = 18,
                             "target24mo" = 24,
                             "target36mo" = 36,
                             "target48mo" = 48,
                             "target60mo" = 60),
         target_ord = recode_factor(target,
                                    "target00mo" = "newborns",
                                    "target0Xmo" = "4-day-olds",
                                    "target01mo" = "1-month-olds",
                                    "target02mo" = "2-month-olds",
                                    "target04mo" = "4-month-olds",
                                    "target06mo" = "6-month-olds",
                                    "target09mo" = "9-month-olds",
                                    "target12mo" = "12-month-olds",
                                    "target18mo" = "18-month-olds",
                                    "target24mo" = "2-year-olds",
                                    "target36mo" = "3-year-olds",
                                    "target48mo" = "4-year-olds",
                                    "target60mo" = "5-year-olds")) %>%
  gather(capacity, response, -c(subid, starts_with("target"))) %>%
  left_join(factors_S2) %>%
  left_join(d_demo %>%
              select(ResponseId, Parent) %>%
              rename(subid = ResponseId, parent = Parent) %>%
              mutate(subid = as.character(subid)))
Joining, by = "capacity"
Joining, by = "subid"

And get an average “score” for each of these factors for each participant:

d_cat_scored <- d_cat %>%
  group_by(subid, parent, 
           target, target_num, target_ord, 
           factor, factor_names) %>%
  summarise(score = mean(response, na.rm = T)) %>%
  ungroup()

Plots

# bootstrapped means and 95% CIs
d_cat_scored_boot <- d_cat_scored %>%
  group_by(target, target_num, target_ord, factor, factor_names) %>%
  multi_boot_standard("score") %>%
  ungroup()
ggplot(d_cat_scored,
       aes(x = target_num, y = score, color = factor_names)) +
  facet_grid(~ factor_names) +
  geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_scored_boot, color = "black",
            aes(y = mean, group = factor_names)) +
  geom_pointrange(data = d_cat_scored_boot, color = "black", fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Set2", guide = "none") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  scale_x_continuous(breaks = seq(0, 60, 12)) +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Exact age, untransformed",
       x = "target age (months)")

ggplot(d_cat_scored,
       aes(x = target_num, y = score, color = factor_names)) +
  facet_grid(~ factor_names) +
  geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_scored_boot, color = "black",
            aes(y = mean, group = factor_names)) +
  geom_pointrange(data = d_cat_scored_boot, color = "black", fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Set2", guide = "none") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  scale_x_continuous(breaks = seq(0, 60, 12), trans = "sqrt") +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Exact age, square-root-transformed",
       x = "age after square-root transformation (months)")

ggplot(d_cat_scored,
       aes(x = target_ord, y = score, color = factor_names)) +
  facet_grid(~ factor_names) +
  geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_scored_boot, color = "black",
            aes(y = mean, group = factor_names)) +
  geom_pointrange(data = d_cat_scored_boot, color = "black", fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Set2", guide = "none") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Age as an ordinal variable",
       x = "age (ordinal)")

Regressions

# contrasts(d_cat_scored$target_ord) <- contr.poly(13)
# contrasts(d_cat_scored$factor) <- contr.sum(4)
contrasts(d_cat$target_ord) <- contr.poly(13)
contrasts(d_cat$factor) <- contr.sum(4)
r1 <- lmer(response ~ factor * poly(target_num, 3) +
             (1 + factor + target_num | subid),
           d_cat %>%
             mutate(target_num = scale(target_num, center = F)))
summary(r1)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ factor * poly(target_num, 3) + (1 + factor + target_num |  
    subid)
   Data: d_cat %>% mutate(target_num = scale(target_num, center = F))

REML criterion at convergence: 536724.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.5360 -0.4298  0.0225  0.5167  5.5499 

Random effects:
 Groups   Name        Variance Std.Dev. Corr                   
 subid    (Intercept) 200.49   14.159                          
          factor1     156.13   12.495    0.65                  
          factor2     145.83   12.076   -0.44 -0.59            
          factor3      69.75    8.352   -0.55 -0.34 -0.24      
          target_num   51.83    7.199   -0.64 -0.42  0.50  0.31
 Residual             334.01   18.276                          
Number of obs: 61620, groups:  subid, 237

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                     68.3739     0.7634  89.569
factor1                          6.9512     0.8216   8.461
factor2                        -38.7255     0.7947 -48.728
factor3                         25.1428     0.5573  45.116
poly(target_num, 3)1          3241.2664    88.4095  36.662
poly(target_num, 3)2         -1237.5812    18.2759 -67.717
poly(target_num, 3)3           532.0777    18.2759  29.114
factor1:poly(target_num, 3)1  -544.0136    31.6548 -17.186
factor2:poly(target_num, 3)1  2670.8981    31.6548  84.376
factor3:poly(target_num, 3)1 -2550.8843    31.6548 -80.584
factor1:poly(target_num, 3)2    32.5828    31.6548   1.029
factor2:poly(target_num, 3)2    38.2604    31.6548   1.209
factor3:poly(target_num, 3)2   881.6516    31.6548  27.852
factor1:poly(target_num, 3)3    48.0128    31.6548   1.517
factor2:poly(target_num, 3)3  -391.9779    31.6548 -12.383
factor3:poly(target_num, 3)3  -354.1489    31.6548 -11.188

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

This is weirdly hard to model… lots of alternative models didn’t converge. Also, those extremely high t-values make me a little suspicious, as do the identical standard errors for the last 9 terms. So, let’s take this with a bit of a grain of salt for now.

Parents vs. non-parents

Study 2

Preliminaries

d_parent <- d_all %>%
  rownames_to_column("subid_target") %>%
  mutate(subid = gsub("_.*$", "", subid_target),
         target = gsub("^.*_", "", subid_target)) %>%
  select(-subid_target) %>%
  mutate(target_num = recode(target,
                             "target00mo" = 0,
                             "target0Xmo" = 4/30,
                             "target01mo" = 1,
                             "target02mo" = 2,
                             "target04mo" = 4,
                             "target06mo" = 6,
                             "target09mo" = 9,
                             "target12mo" = 12,
                             "target18mo" = 18,
                             "target24mo" = 24,
                             "target36mo" = 36,
                             "target48mo" = 48,
                             "target60mo" = 60),
         target_ord = recode_factor(target,
                                    "target00mo" = "newborns",
                                    "target0Xmo" = "4-day-olds",
                                    "target01mo" = "1-month-olds",
                                    "target02mo" = "2-month-olds",
                                    "target04mo" = "4-month-olds",
                                    "target06mo" = "6-month-olds",
                                    "target09mo" = "9-month-olds",
                                    "target12mo" = "12-month-olds",
                                    "target18mo" = "18-month-olds",
                                    "target24mo" = "2-year-olds",
                                    "target36mo" = "3-year-olds",
                                    "target48mo" = "4-year-olds",
                                    "target60mo" = "5-year-olds")) %>%
  gather(capacity, response, -c(subid, starts_with("target"))) %>%
  left_join(d_demo %>%
              select(ResponseId, Parent) %>%
              rename(subid = ResponseId, parent = Parent) %>%
              mutate(subid = as.character(subid)))
Joining, by = "subid"
parent_counts <- d_demo %>% 
  distinct(ResponseId, Parent) %>% 
  rename(subid = ResponseId, parent = Parent) %>%
  count(parent) %>% 
  mutate(proportion = n/sum(n))
knitr::kable(parent_counts, digits = 3)
parent n proportion
No 146 0.616
Yes 88 0.371
NA 3 0.013
d_demo %>%
  count(Parent, ChildrenOldestAge_collapse)

Given these numbers, I think our best bet it just to look at parents vs. non-parents, and not try to separate out parents of young children (too few!).

scores_S2 <- efa_S2$scores %>%
  data.frame() %>%
  rownames_to_column("subid_target") %>%
  mutate(subid = gsub("_.*$", "", subid_target),
         target = gsub("^.*_", "", subid_target)) %>%
  select(-subid_target) %>%
  mutate(target_num = recode(target,
                             "target00mo" = 0,
                             "target0Xmo" = 4/30,
                             "target01mo" = 1,
                             "target02mo" = 2,
                             "target04mo" = 4,
                             "target06mo" = 6,
                             "target09mo" = 9,
                             "target12mo" = 12,
                             "target18mo" = 18,
                             "target24mo" = 24,
                             "target36mo" = 36,
                             "target48mo" = 48,
                             "target60mo" = 60),
         target_ord = recode_factor(target,
                                    "target00mo" = "newborns",
                                    "target0Xmo" = "4-day-olds",
                                    "target01mo" = "1-month-olds",
                                    "target02mo" = "2-month-olds",
                                    "target04mo" = "4-month-olds",
                                    "target06mo" = "6-month-olds",
                                    "target09mo" = "9-month-olds",
                                    "target12mo" = "12-month-olds",
                                    "target18mo" = "18-month-olds",
                                    "target24mo" = "2-year-olds",
                                    "target36mo" = "3-year-olds",
                                    "target48mo" = "4-year-olds",
                                    "target60mo" = "5-year-olds")) %>%
  gather(factor, score, -c(subid, starts_with("target"))) %>%
  left_join(d_parent %>% distinct(subid, parent)) %>%
  left_join(d_cat %>% distinct(factor, factor_names)) %>%
  mutate(factor = factor(factor))
Joining, by = "subid"
Joining, by = "factor"
Column `factor` joining character vector and factor, coercing into character vector

Plots

Factor scores

# bootstrapped means and 95% CIs
d_parent_boot <- scores_S2 %>%
  filter(!is.na(parent)) %>%
  group_by(parent, target, target_num, target_ord, factor_names) %>%
  multi_boot_standard("score") %>%
  ungroup() %>%
  data.frame()
scores_S2 %>%
  filter(!is.na(parent)) %>%
  ggplot(aes(x = target_num, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.05) +
  geom_line(data = d_parent_boot, aes(y = mean, group = parent)) +
  geom_pointrange(data = d_parent_boot, fatten = 1.5, # note: too close to dodge
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = parent), #color = "black",
  #             method = "lm", formula = "y ~ poly(x, 3)") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_x_continuous(breaks = seq(0, 60, 12)) +
  scale_y_continuous(breaks = seq(-10, 10, 0.5)) +
  labs(title = "Developmental trajectories of factor scores, by parent status",
       subtitle = "Exact age, untransformed",
       color = "parent status: ",
       x = "target age (months)", y = "score (NOTE: scales differ)")

scores_S2 %>%
  filter(!is.na(parent)) %>%
  ggplot(aes(x = target_num, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.05) +
  geom_line(data = d_parent_boot, aes(y = mean, group = parent),
            position = position_dodge(width = 0.3)) +
  geom_pointrange(data = d_parent_boot, fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  position = position_dodge(width = 0.3)) +
  # geom_smooth(aes(group = parent), #color = "black",
  #             method = "lm", formula = "y ~ poly(x, 3)") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_x_continuous(breaks = seq(0, 60, 12), trans = "sqrt") +
  scale_y_continuous(breaks = seq(-10, 10, 0.5)) +
  labs(title = "Developmental trajectories of factor scores, by parent status",
       subtitle = "Exact age, square-root transformed",
       color = "parent status: ",
       x = "age after square-root transformation (months)", 
       y = "score (NOTE: scales differ)")

scores_S2 %>%
  filter(!is.na(parent)) %>%
  ggplot(aes(x = target_ord, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.05) +
  geom_line(data = d_parent_boot, aes(y = mean, group = parent),
            position = position_dodge(width = 0.5)) +
  geom_pointrange(data = d_parent_boot, fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  position = position_dodge(width = 0.5)) +
  # geom_smooth(aes(group = parent), #color = "black",
  #             method = "lm", formula = "y ~ poly(x, 3)") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_y_continuous(breaks = seq(-10, 10, 0.5)) +
  labs(title = "Developmental trajectories of factor scores, by parent status",
       subtitle = "Age as ordinal variable",
       color = "parent status: ",
       x = "age (ordinal)", 
       y = "score (NOTE: scales differ)")

Category ‘summary scores’

# bootstrapped means and 95% CIs
d_cat_parent_scored_boot <- d_cat_scored %>%
  filter(!is.na(parent)) %>%
  group_by(parent, target, target_num, target_ord, factor, factor_names) %>%
  multi_boot_standard("score") %>%
  ungroup()
ggplot(d_cat_parent_scored_boot,
       aes(x = target_num, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_parent_scored_boot, 
            aes(y = mean, group = parent)) +
  geom_pointrange(data = d_cat_parent_scored_boot, fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_x_continuous(breaks = seq(0, 60, 12)) +
  scale_y_continuous(breaks = seq(0, 100, 10)) +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Exact age, untransformed",
       x = "target age (months)",
       y = "score (NOTE: scales differ)")

ggplot(d_cat_parent_scored_boot,
       aes(x = target_num, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_parent_scored_boot, 
            aes(y = mean, group = parent)) +
  geom_pointrange(data = d_cat_parent_scored_boot, fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_x_continuous(breaks = seq(0, 60, 12), trans = "sqrt") +
  scale_y_continuous(breaks = seq(0, 100, 10)) +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Exact age, square-root transformation",
       x = "age after square-root transformation (months)",
       y = "score (NOTE: scales differ)")

ggplot(d_cat_parent_scored_boot,
       aes(x = target_ord, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_parent_scored_boot, 
            aes(y = mean, group = parent)) +
  geom_pointrange(data = d_cat_parent_scored_boot, fatten = 1.5,
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_y_continuous(breaks = seq(0, 100, 10)) +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Age as an ordinal variable",
       x = "age (ordinal)",
       y = "score (NOTE: scales differ)")

All of these visualizations suggest that, relative to non-parents (n = NA), parents (n = NA) tended to perceive greater abilities, in all domains except for bodily sensations. For both negative emotions and positive/social emotions, this difference is greatest in the mid-range of the target ages (12-24 months); for cognition & control, it’s greater at the older end of the target ages (e.g., 3-5 years). It doesn’t look like a huge effect, but it’s intruiging.

Regressions

There are many ways that we could choose to model this - I’ll try out the factor scores first, adapting our primary regression models (not in this notebook).

contrasts(scores_S2$parent) <- contr.treatment(2, base = 1) # baseline: NON-parents
contrasts(scores_S2$factor) <- contr.sum(4)
r2 <- lmer(score ~ target_num * factor * parent
           + (target_num + factor | subid),
           scores_S2 %>%
             mutate(target_num = target_num/12))
summary(r2)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target_num * factor * parent + (target_num + factor |  
    subid)
   Data: scores_S2 %>% mutate(target_num = target_num/12)

REML criterion at convergence: 22480.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-9.3553 -0.4388  0.0524  0.5114  5.2974 

Random effects:
 Groups   Name        Variance Std.Dev. Corr                   
 subid    (Intercept) 0.3491   0.5908                          
          target_num  0.0165   0.1284   -0.73                  
          factor1     0.1947   0.4413    0.49 -0.40            
          factor2     0.2303   0.4799   -0.66  0.56 -0.40      
          factor3     0.2605   0.5104    0.24  0.00 -0.22 -0.61
 Residual             0.2919   0.5403                          
Number of obs: 12168, groups:  subid, 234

Fixed effects:
                            Estimate Std. Error t value
(Intercept)                -0.424399   0.049602  -8.556
target_num                  0.279097   0.011334  24.624
factor1                     0.078297   0.039260   1.994
factor2                    -0.273518   0.042253  -6.473
factor3                     0.253010   0.044634   5.669
parent2                     0.070601   0.080884   0.873
target_num:factor1         -0.058596   0.006811  -8.603
target_num:factor2          0.190717   0.006811  28.001
target_num:factor3         -0.170985   0.006811 -25.104
target_num:parent2          0.003333   0.018482   0.180
factor1:parent2             0.005619   0.064020   0.088
factor2:parent2            -0.051089   0.068900  -0.741
factor3:parent2             0.031692   0.072783   0.435
target_num:factor1:parent2 -0.002939   0.011107  -0.265
target_num:factor2:parent2  0.053753   0.011107   4.840
target_num:factor3:parent2 -0.046204   0.011107  -4.160

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

The last three coefficients here are where the action is: According to this model, the difference between parents and non-parents in perceived developmental trajectories (target_num:parent2, which is not significant collapsing across factors) is exaggerated in the domain of cognition and control (target_num:factor2:parent2) and diminished in the domain of bodily sensations (target_num:factor3:parent2).

Let’s try adding polynomial effects:

r3 <- lmer(score ~ poly(target_num, 3) * factor * parent
           + (poly(target_num, 1) + factor | subid),
           scores_S2 %>%
             mutate(target_num = target_num/12))
summary(r3)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ poly(target_num, 3) * factor * parent + (poly(target_num,  
    1) + factor | subid)
   Data: scores_S2 %>% mutate(target_num = target_num/12)

REML criterion at convergence: 19808.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-10.3042  -0.4652   0.0017   0.5305   5.8317 

Random effects:
 Groups   Name                Variance Std.Dev. Corr                   
 subid    (Intercept)           0.2278  0.4773                         
          poly(target_num, 1) 519.8012 22.7991  -0.51                  
          factor1               0.1982  0.4452   0.45 -0.39            
          factor2               0.2338  0.4835  -0.60  0.54 -0.40      
          factor3               0.2640  0.5138   0.30  0.00 -0.22 -0.61
 Residual                       0.2316  0.4812                         
Number of obs: 12168, groups:  subid, 234

Fixed effects:
                                       Estimate Std. Error t value
(Intercept)                           -0.030561   0.039884  -0.766
poly(target_num, 3)1                  48.855288   1.983984  24.625
poly(target_num, 3)2                 -19.550418   0.613116 -31.887
poly(target_num, 3)3                   8.448995   0.613116  13.780
factor1                               -0.004388   0.038065  -0.115
factor2                               -0.004395   0.041145  -0.107
factor3                                0.011731   0.043587   0.269
parent2                                0.075304   0.065038   1.158
poly(target_num, 3)1:factor1         -10.257028   1.061949  -9.659
poly(target_num, 3)2:factor1           3.413024   1.061949   3.214
poly(target_num, 3)3:factor1          -1.785482   1.061949  -1.681
poly(target_num, 3)1:factor2          33.384462   1.061949  31.437
poly(target_num, 3)2:factor2           3.384910   1.061949   3.187
poly(target_num, 3)3:factor2          -6.433547   1.061949  -6.058
poly(target_num, 3)1:factor3         -29.930494   1.061949 -28.184
poly(target_num, 3)2:factor3           8.594647   1.061949   8.093
poly(target_num, 3)3:factor3          -3.251241   1.061949  -3.062
poly(target_num, 3)1:parent2           0.583455   3.235228   0.180
poly(target_num, 3)2:parent2          -2.031708   0.999792  -2.032
poly(target_num, 3)3:parent2           1.883539   0.999792   1.884
factor1:parent2                        0.001472   0.062072   0.024
factor2:parent2                        0.024763   0.067094   0.369
factor3:parent2                       -0.033507   0.071076  -0.471
poly(target_num, 3)1:factor1:parent2  -0.514473   1.731690  -0.297
poly(target_num, 3)2:factor1:parent2  -0.041808   1.731690  -0.024
poly(target_num, 3)3:factor1:parent2   1.099314   1.731690   0.635
poly(target_num, 3)1:factor2:parent2   9.409337   1.731690   5.434
poly(target_num, 3)2:factor2:parent2  -2.361622   1.731690  -1.364
poly(target_num, 3)3:factor2:parent2  -1.057673   1.731690  -0.611
poly(target_num, 3)1:factor3:parent2  -8.087893   1.731690  -4.671
poly(target_num, 3)2:factor3:parent2   6.669873   1.731690   3.852
poly(target_num, 3)3:factor3:parent2  -4.830063   1.731690  -2.789

Correlation matrix not shown by default, as p = 32 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

A lot to sort through here, but here are some observations:

  • Collapsing across factors, it seems like parents might perceive exaggerated non-linearities? (poly(target_num, 3)2:parent2 and poly(target_num, 3)3:parent2)
  • Compared to collapsing across factors, not a lot of additional parent vs. non-parent differences in negative emotions (factor 1)
  • Compared to collapsing across factors, parents perceived more dramatic (linear) growth in cognition/control (factor 2; poly(target_num, 3)1:factor2:parent2)
  • Compared to collapsing across factors, in the domain of bodily sensations (factor 3), parents perceived less growth (poly(target_num, 3)1:factor3:parent2). I’m not sure how to interpret the differences in non-linearity here.

You could imagine re-running any of these with a square-root transformation on target age, and/or with the ‘summary scores’ by category, but I’m not going to do that right now.

Study 1

Preliminaries

parent_counts_S1 <- demo_S1 %>% 
  distinct(ResponseId, Parent) %>% 
  rename(subid = ResponseId, parent = Parent) %>%
  count(parent) %>% 
  mutate(proportion = n/sum(n))
knitr::kable(parent_counts_S1, digits = 3)
parent n proportion
No 147 0.653
Yes 77 0.342
NA 1 0.004
scores_S1 <- efa_S1$scores %>%
  data.frame() %>%
  rownames_to_column("subid_target") %>%
  mutate(subid = gsub("_.*$", "", subid_target),
         target = gsub("^.*_", "", subid_target)) %>%
  select(-subid_target) %>%
  mutate(target_num = recode(target,
                             "target00mo" = 0,
                             "target0Xmo" = 4/30,
                             "target01mo" = 1,
                             "target02mo" = 2,
                             "target04mo" = 4,
                             "target06mo" = 6,
                             "target09mo" = 9,
                             "target12mo" = 12,
                             "target18mo" = 18,
                             "target24mo" = 24,
                             "target36mo" = 36,
                             "target48mo" = 48,
                             "target60mo" = 60),
         target_ord = recode_factor(target,
                                    "target00mo" = "newborns",
                                    "target0Xmo" = "4-day-olds",
                                    "target01mo" = "1-month-olds",
                                    "target02mo" = "2-month-olds",
                                    "target04mo" = "4-month-olds",
                                    "target06mo" = "6-month-olds",
                                    "target09mo" = "9-month-olds",
                                    "target12mo" = "12-month-olds",
                                    "target18mo" = "18-month-olds",
                                    "target24mo" = "2-year-olds",
                                    "target36mo" = "3-year-olds",
                                    "target48mo" = "4-year-olds",
                                    "target60mo" = "5-year-olds")) %>%
  gather(factor, score, -c(subid, starts_with("target"))) %>%
  left_join(demo_S1 %>% distinct(ResponseId, Parent) %>%
              rename(subid = ResponseId, parent = Parent) %>%
              mutate(subid = as.character(subid))) %>%
  mutate(factor_names = recode_factor(factor,
                                      "MR4" = "Negative emotions (S1 F4)",
                                      "MR1" = "Cognition & control (S1 F1)",
                                      "MR2" = "Bodily sensations (S1 F2)",
                                      "MR3" = "Positive/social emotions (S1 F3)"),
         factor = factor(factor))
Joining, by = "subid"

Plots

Factor scores

# bootstrapped means and 95% CIs
d_parent_boot_S1 <- scores_S1 %>%
  filter(!is.na(parent)) %>%
  group_by(parent, target, target_num, target_ord, factor_names) %>%
  multi_boot_standard("score") %>%
  ungroup() %>%
  data.frame()
scores_S1 %>%
  filter(!is.na(parent)) %>%
  ggplot(aes(x = target_num, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.05) +
  geom_line(data = d_parent_boot_S1,
            position = position_dodge(width = 5),
            aes(y = mean, group = parent)) +
  geom_pointrange(data = d_parent_boot_S1, 
                  position = position_dodge(width = 5),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = parent), #color = "black",
  #             method = "lm", formula = "y ~ poly(x, 3)") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_x_continuous(breaks = seq(0, 60, 12)) +
  scale_y_continuous(breaks = seq(-10, 10, 0.5)) +
  labs(title = "Developmental trajectories of factor scores, by parent status (STUDY 1)",
       subtitle = "Exact age, untransformed",
       color = "parent status: ",
       x = "target age (months)", y = "score (NOTE: scales differ)")

I won’t bother to re-plot with different treatments of age, since there are only three target ages here.

Category ‘summary scores’

# make new dataframe
d_cat_S1 <- d_all_S1 %>%
  rename(subid_target = X) %>%
  mutate(subid = gsub("_.*$", "", subid_target),
         target = gsub("^.*_", "", subid_target)) %>%
  select(-subid_target) %>%
  mutate(target_num = recode(target,
                             "target00mo" = 0,
                             "target0Xmo" = 4/30,
                             "target01mo" = 1,
                             "target02mo" = 2,
                             "target04mo" = 4,
                             "target06mo" = 6,
                             "target09mo" = 9,
                             "target12mo" = 12,
                             "target18mo" = 18,
                             "target24mo" = 24,
                             "target36mo" = 36,
                             "target48mo" = 48,
                             "target60mo" = 60),
         target_ord = recode_factor(target,
                                    "target00mo" = "newborns",
                                    "target0Xmo" = "4-day-olds",
                                    "target01mo" = "1-month-olds",
                                    "target02mo" = "2-month-olds",
                                    "target04mo" = "4-month-olds",
                                    "target06mo" = "6-month-olds",
                                    "target09mo" = "9-month-olds",
                                    "target12mo" = "12-month-olds",
                                    "target18mo" = "18-month-olds",
                                    "target24mo" = "2-year-olds",
                                    "target36mo" = "3-year-olds",
                                    "target48mo" = "4-year-olds",
                                    "target60mo" = "5-year-olds")) %>%
  gather(capacity, response, -c(subid, starts_with("target"))) %>%
  left_join(factors_S2) %>%
  left_join(demo_S1 %>%
              select(ResponseId, Parent) %>%
              rename(subid = ResponseId, parent = Parent) %>%
              mutate(subid = as.character(subid))) %>%
  filter(!is.na(factor))
Joining, by = "capacity"
Joining, by = "subid"

And get an average “score” for each of these factors for each participant:

d_cat_scored_S1 <- d_cat_S1 %>%
  group_by(subid, parent, 
           target, target_num, target_ord, 
           factor, factor_names) %>%
  summarise(score = mean(response, na.rm = T)) %>%
  ungroup()
# bootstrapped means and 95% CIs
d_cat_parent_scored_boot_S1 <- d_cat_scored_S1 %>%
  filter(!is.na(parent)) %>%
  group_by(parent, target, target_num, target_ord, factor, factor_names) %>%
  multi_boot_standard("score") %>%
  ungroup()
ggplot(d_cat_parent_scored_boot_S1,
       aes(x = target_num, y = score, color = parent)) +
  facet_wrap(~ factor_names, ncol = 4, scales = "free") +
  # geom_line(aes(group = subid), alpha = 0.15) +
  geom_line(data = d_cat_parent_scored_boot_S1,
            position = position_dodge(width = 5),
            aes(y = mean, group = parent)) +
  geom_pointrange(data = d_cat_parent_scored_boot_S1,
                  position = position_dodge(width = 5),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper)) +
  # geom_smooth(aes(group = factor_names),
  #             method = "lm", formula = "y ~ poly(x, 3)",
  #             color = "black") +
  scale_color_brewer(palette = "Paired") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        legend.position = "bottom") +
  scale_x_continuous(breaks = seq(0, 60, 12)) +
  scale_y_continuous(breaks = seq(0, 100, 10)) +
  labs(title = "Developmental trajectories of category 'summary scores'",
       subtitle = "Exact age, untransformed",
       x = "target age (months)",
       y = "score (NOTE: scales differ)")

Looking quickly at these two visualizations of Study 1, I’d say that there’s a hint of the same patterns in the domains of negative emotions and positive social emotions (parents attributed more than non-parents, especially at 9 months), and in cognition/control (parents attributed more than non-parents at 5 years). So, generally consistent?

I won’t run regression analyses just now.

LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMiIKc3VidGl0bGU6ICJFeHBsb3JhdG9yeSBhbmFseXNlcyIKZGF0ZTogMjAxOC0wOS0xNApvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCiJCYWJ5IE1lbnRhbCBMaWZlOiBTdHVkeSAyIiB3YXMgY29uZHVjdGVkIG9uIE1UdXJrIG9uIDIwMTgtMDgtMDQuCgpPdXIgcGxhbm5lZCBzYW1wbGUgd2FzIDMwMCBwYXJ0aWNpcGFudHMsIGFuZCB3ZSBhbnRpY2lwYXRlZCB0aGF0IHJvdWdobHkgODAlIG9mIHJlY3J1aXRlZCBwYXJ0aWNpcGFudHMgd291bGQgcGFzcyBhbGwgb2Ygb3VyIGF0dGVudGlvbiBjaGVja3MsIHNvIHdlIGluaXRpYWxseSByZWNydWl0ZWQgMzc4IHBhcnRpY2lwYW50cyAob24gdGhlIGlkZWEgdGhhdCB+ODAlIG9mIDM3OCB+IDMwMCBwYXJ0aWNpcGFudHM7IG5vdGUgdGhhdCBmb3IgYWRtaW5pc3RyYXRpdmUgcHVycG9zZXMgd2UgbmVlZCB0byByZWN1aXQgcGFydGljaXBhbnRzIGluIGJhdGNoZXMgdGhhdCB3ZXJlIGRpdmlzaWJsZSBieSA5KS4gQWZ0ZXIgZmlsdGVyaW5nIG91dCBwYXJ0aWNpcGFudHMgd2hvIGZhaWxlZCBhdCBsZWFzdCBvbmUgb2Ygb3VyIGF0dGVudGlvbiBjaGVja3MsIHdlIGVuZGVkIHVwIHJldGFpbmluZyBmZXdlciB0aGFuIDMwMCBwYXJ0aWNpcGFudHMsIHNvIHdlIHJlY3J1aXRlZCBhbiBhZGRpdGlvbmFsIDE2IHBhcnRpY2lwYW50cyBmb3IgYSB0b3RhbCBvZiAzOTQgcGVvcGxlIHJlY3J1aXRlZC4gQXQgZWFjaCBzdGFnZSwgd2UgcmVjcnVpdGVkIHdvbWVuIGFuZCBtZW4gdGhyb3VnaCBzZXBhcmF0ZSBzdHVkaWVzLCBpbiBob3BlcyBvZiBhY3F1aXJpbmcgYSByb3VnaGx5IGVxdWFsIHNwbGl0IGJldHdlZW4gZ2VuZGVycy4KCkluIHRoZSBlbmQsIHdlIGVuZGVkIHVwIHdpdGggYSBzYW1wbGUgb2YgMzA0IHBhcnRpY2lwYW50cyB3aG8gcGFzc2VkIG91ciBhdHRlbnRpb24gY2hlY2tzLCAyMzcgb2Ygd2hvbSBjYW1lIGZyb20gdW5pcXVlIEdQUyBjb29yZGluYXRlcy4KCioqRm9yIHRoaXMgZmlyc3QgcGFzcywgdGhlc2UgZGF0YSBfZXhjbHVkZV8gcGFydGljaXBhbnRzIHdoZXJlIHRoZXJlIGlzIGFub3RoZXIgcGFydGljaXBhbnQgd2l0aCBhbiBpZGVudGljYWwgc2V0IG9mIEdQUyBjb29yZGluYXRlcyBhcyByZWNvcmRlZCBieSBRdWFsdHJpY3MuKioKCkVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdGllcyBhdCAxMyB0YXJnZXQgYWdlcyBiZXR3ZWVuIHRoZSBhZ2VzIG9mIDAgYW5kIDUgeWVhcnMuIEZvciBlYWNoIHRhcmdldCwgdGhleSByYXRlZCAyMCBtZW50YWwgY2FwYWNpdGllcyBvbiBhIHNjYWxlIGZyb20gMCAobm90IGF0IGFsbCBjYXBhYmxlKSB0byAxMDAgKGNvbXBsZXRlbHkgY2FwYWJsZSkuIAoKRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgc3R1ZHksIHNlZSBvdXIgcHJlcmVnaXN0cmF0aW9uIFtoZXJlXShodHRwczovL29zZi5pby9qNzJkZy8pLiAKCioqSGVyZSB3ZSBydW4gc29tZSBleHBsb3JhdG9yeSBhbmFseXNlcyBvbiB0aGVzZSBkYXRhLioqCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBzZXQgdGhlbWUgZm9yIGdncGxvdHMKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3J9CiMgcnVuIHNvdXJjZSBjb2RlIChleHRyYSBob21lLW1hZGUgZnVuY3Rpb25zKQpzb3VyY2UoIi4vc2NyaXB0cy9tYXhfZmFjdG9yc19lZmEuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Bsb3RfZnVuLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9yZXRlbl9mdW4uUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3RhYmxlX2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9wcmVwLlIiKQpgYGAKCiMgVHJlYXRpbmcgZmFjdG9ycyBhcyBjYXRlZ29yaWVzCgojIyBQcmVsaW1pbmFyaWVzCgpGaXJzdCwgSSdsbCBkbyB0aGUgZmFjdG9yIGFuYWx5c2lzLCBhbmQgZ2V0IGEgbGlzdCBvZiB0aGUgdG9wIDUgaXRlbXMgYnkgZmFjdG9yOgoKYGBge3J9CiMgbG9hZCBpbiBTMSBlZmEgaW4gY2FzZSB3ZSBuZWVkIGl0CmVmYV9TMSA8LSByZWFkUkRTKCIuLi9zdHVkeSAxL3MxX2VmYS5yZHMiKQpkX2FsbF9TMSA8LSByZWFkLmNzdigiLi4vc3R1ZHkgMS9zMV9kYXRhLmNzdiIpCmRlbW9fUzEgPC0gcmVhZC5jc3YoIi4uL3N0dWR5IDEvczFfZGVtby5jc3YiKQpgYGAKCmBgYHtyfQojIGNvbmR1Y3QgUzIgZWZhCmVmYV9TMiA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIsIGZtID0gIm1pbnJlcyIsCiAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7cn0KdGFibGVfZnVuKGVmYV9TMiwgbnVtX2l0ZW1zID0gNSwgcG9zX2FicyA9ICJhYnMiKQpgYGAKCk5vdyBJJ2xsIHVzZSB0aGlzIHRvIGRlZmluZSBjYXRlZ29yaWVzIG9mIG1lbnRhbCBjYXBhY2l0aWVzOgoKYGBge3J9CiMgZ2V0IGl0ZW1zIGJ5IGZhY3RvcgpmYWN0b3JzX1MyIDwtIGVmYV9TMiRsb2FkaW5nc1tdICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImNhcGFjaXR5IikgJT4lCiAgZ2F0aGVyKGZhY3RvciwgbG9hZGluZywgLWNhcGFjaXR5KSAlPiUKICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgdG9wX24oMSwgbG9hZGluZykgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCgtbG9hZGluZykgJT4lCiAgbXV0YXRlKGZhY3Rvcl9uYW1lcyA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUjEiID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVIyIiA9ICJDb2duaXRpb24gJiBjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVIzIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SNCIgPSAiUG9zaXRpdmUvc29jaWFsIGVtb3Rpb25zIiksCiAgICAgICAgIGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKQoKIyBtYWtlIG5ldyBkYXRhZnJhbWUKZF9jYXQgPC0gZF9hbGwgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF90YXJnZXQiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX3RhcmdldCksCiAgICAgICAgIHRhcmdldCA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfdGFyZ2V0KSkgJT4lCiAgc2VsZWN0KC1zdWJpZF90YXJnZXQpICU+JQogIG11dGF0ZSh0YXJnZXRfbnVtID0gcmVjb2RlKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9IDQvMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNG1vIiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxMm1vIiA9IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9IDM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9IDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9IDYwKSwKICAgICAgICAgdGFyZ2V0X29yZCA9IHJlY29kZV9mYWN0b3IodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAibmV3Ym9ybnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSAiNC1kYXktb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMW1vIiA9ICIxLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAiMi1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gIjQtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNm1vIiA9ICI2LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSAiOS1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gIjEyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MThtbyIgPSAiMTgtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9ICIyLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9ICIzLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9ICI0LXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9ICI1LXllYXItb2xkcyIpKSAlPiUKICBnYXRoZXIoY2FwYWNpdHksIHJlc3BvbnNlLCAtYyhzdWJpZCwgc3RhcnRzX3dpdGgoInRhcmdldCIpKSkgJT4lCiAgbGVmdF9qb2luKGZhY3RvcnNfUzIpICU+JQogIGxlZnRfam9pbihkX2RlbW8gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KFJlc3BvbnNlSWQsIFBhcmVudCkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKHN1YmlkID0gUmVzcG9uc2VJZCwgcGFyZW50ID0gUGFyZW50KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoc3ViaWQgPSBhcy5jaGFyYWN0ZXIoc3ViaWQpKSkKYGBgCgpBbmQgZ2V0IGFuIGF2ZXJhZ2UgInNjb3JlIiBmb3IgZWFjaCBvZiB0aGVzZSBmYWN0b3JzIGZvciBlYWNoIHBhcnRpY2lwYW50OgoKYGBge3J9CmRfY2F0X3Njb3JlZCA8LSBkX2NhdCAlPiUKICBncm91cF9ieShzdWJpZCwgcGFyZW50LCAKICAgICAgICAgICB0YXJnZXQsIHRhcmdldF9udW0sIHRhcmdldF9vcmQsIAogICAgICAgICAgIGZhY3RvciwgZmFjdG9yX25hbWVzKSAlPiUKICBzdW1tYXJpc2Uoc2NvcmUgPSBtZWFuKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgoKIyMgUGxvdHMKCmBgYHtyfQojIGJvb3RzdHJhcHBlZCBtZWFucyBhbmQgOTUlIENJcwpkX2NhdF9zY29yZWRfYm9vdCA8LSBkX2NhdF9zY29yZWQgJT4lCiAgZ3JvdXBfYnkodGFyZ2V0LCB0YXJnZXRfbnVtLCB0YXJnZXRfb3JkLCBmYWN0b3IsIGZhY3Rvcl9uYW1lcykgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2NvcmUiKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNX0KZ2dwbG90KGRfY2F0X3Njb3JlZCwKICAgICAgIGFlcyh4ID0gdGFyZ2V0X251bSwgeSA9IHNjb3JlLCBjb2xvciA9IGZhY3Rvcl9uYW1lcykpICsKICBmYWNldF9ncmlkKH4gZmFjdG9yX25hbWVzKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IHN1YmlkKSwgYWxwaGEgPSAwLjE1KSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkX2NhdF9zY29yZWRfYm9vdCwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICBhZXMoeSA9IG1lYW4sIGdyb3VwID0gZmFjdG9yX25hbWVzKSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9jYXRfc2NvcmVkX2Jvb3QsIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMS41LAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSkgKwogICMgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gZmFjdG9yX25hbWVzKSwKICAjICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSAieSB+IHBvbHkoeCwgMykiLAogICMgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIsIGd1aWRlID0gIm5vbmUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgMTIpKSArCiAgbGFicyh0aXRsZSA9ICJEZXZlbG9wbWVudGFsIHRyYWplY3RvcmllcyBvZiBjYXRlZ29yeSAnc3VtbWFyeSBzY29yZXMnIiwKICAgICAgIHN1YnRpdGxlID0gIkV4YWN0IGFnZSwgdW50cmFuc2Zvcm1lZCIsCiAgICAgICB4ID0gInRhcmdldCBhZ2UgKG1vbnRocykiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpnZ3Bsb3QoZF9jYXRfc2NvcmVkLAogICAgICAgYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gc2NvcmUsIGNvbG9yID0gZmFjdG9yX25hbWVzKSkgKwogIGZhY2V0X2dyaWQofiBmYWN0b3JfbmFtZXMpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc3ViaWQpLCBhbHBoYSA9IDAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRfY2F0X3Njb3JlZF9ib290LCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgZ3JvdXAgPSBmYWN0b3JfbmFtZXMpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX2NhdF9zY29yZWRfYm9vdCwgY29sb3IgPSAiYmxhY2siLCBmYXR0ZW4gPSAxLjUsCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpKSArCiAgIyBnZW9tX3Ntb290aChhZXMoZ3JvdXAgPSBmYWN0b3JfbmFtZXMpLAogICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgZm9ybXVsYSA9ICJ5IH4gcG9seSh4LCAzKSIsCiAgIyAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIiwgZ3VpZGUgPSAibm9uZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCAxMiksIHRyYW5zID0gInNxcnQiKSArCiAgbGFicyh0aXRsZSA9ICJEZXZlbG9wbWVudGFsIHRyYWplY3RvcmllcyBvZiBjYXRlZ29yeSAnc3VtbWFyeSBzY29yZXMnIiwKICAgICAgIHN1YnRpdGxlID0gIkV4YWN0IGFnZSwgc3F1YXJlLXJvb3QtdHJhbnNmb3JtZWQiLAogICAgICAgeCA9ICJhZ2UgYWZ0ZXIgc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24gKG1vbnRocykiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpnZ3Bsb3QoZF9jYXRfc2NvcmVkLAogICAgICAgYWVzKHggPSB0YXJnZXRfb3JkLCB5ID0gc2NvcmUsIGNvbG9yID0gZmFjdG9yX25hbWVzKSkgKwogIGZhY2V0X2dyaWQofiBmYWN0b3JfbmFtZXMpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc3ViaWQpLCBhbHBoYSA9IDAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRfY2F0X3Njb3JlZF9ib290LCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgZ3JvdXAgPSBmYWN0b3JfbmFtZXMpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX2NhdF9zY29yZWRfYm9vdCwgY29sb3IgPSAiYmxhY2siLCBmYXR0ZW4gPSAxLjUsCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpKSArCiAgIyBnZW9tX3Ntb290aChhZXMoZ3JvdXAgPSBmYWN0b3JfbmFtZXMpLAogICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgZm9ybXVsYSA9ICJ5IH4gcG9seSh4LCAzKSIsCiAgIyAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIiwgZ3VpZGUgPSAibm9uZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkRldmVsb3BtZW50YWwgdHJhamVjdG9yaWVzIG9mIGNhdGVnb3J5ICdzdW1tYXJ5IHNjb3JlcyciLAogICAgICAgc3VidGl0bGUgPSAiQWdlIGFzIGFuIG9yZGluYWwgdmFyaWFibGUiLAogICAgICAgeCA9ICJhZ2UgKG9yZGluYWwpIikKYGBgCgojIyBSZWdyZXNzaW9ucwoKYGBge3J9CiMgY29udHJhc3RzKGRfY2F0X3Njb3JlZCR0YXJnZXRfb3JkKSA8LSBjb250ci5wb2x5KDEzKQojIGNvbnRyYXN0cyhkX2NhdF9zY29yZWQkZmFjdG9yKSA8LSBjb250ci5zdW0oNCkKCmNvbnRyYXN0cyhkX2NhdCR0YXJnZXRfb3JkKSA8LSBjb250ci5wb2x5KDEzKQpjb250cmFzdHMoZF9jYXQkZmFjdG9yKSA8LSBjb250ci5zdW0oNCkKYGBgCgpgYGB7cn0KcjEgPC0gbG1lcihyZXNwb25zZSB+IGZhY3RvciAqIHBvbHkodGFyZ2V0X251bSwgMykgKwogICAgICAgICAgICAgKDEgKyBmYWN0b3IgKyB0YXJnZXRfbnVtIHwgc3ViaWQpLAogICAgICAgICAgIGRfY2F0ICU+JQogICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSBzY2FsZSh0YXJnZXRfbnVtLCBjZW50ZXIgPSBGKSkpCgpzdW1tYXJ5KHIxKQpgYGAKClRoaXMgaXMgd2VpcmRseSBoYXJkIHRvIG1vZGVsLi4uIGxvdHMgb2YgYWx0ZXJuYXRpdmUgbW9kZWxzIGRpZG4ndCBjb252ZXJnZS4gQWxzbywgdGhvc2UgZXh0cmVtZWx5IGhpZ2ggdC12YWx1ZXMgbWFrZSBtZSBhIGxpdHRsZSBzdXNwaWNpb3VzLCBhcyBkbyB0aGUgaWRlbnRpY2FsIHN0YW5kYXJkIGVycm9ycyBmb3IgdGhlIGxhc3QgOSB0ZXJtcy4gU28sIGxldCdzIHRha2UgdGhpcyB3aXRoIGEgYml0IG9mIGEgZ3JhaW4gb2Ygc2FsdCBmb3Igbm93LgoKCiMgUGFyZW50cyB2cy4gbm9uLXBhcmVudHMKCiMjIFN0dWR5IDIKCiMjIyBQcmVsaW1pbmFyaWVzCgpgYGB7cn0KZF9wYXJlbnQgPC0gZF9hbGwgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF90YXJnZXQiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX3RhcmdldCksCiAgICAgICAgIHRhcmdldCA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfdGFyZ2V0KSkgJT4lCiAgc2VsZWN0KC1zdWJpZF90YXJnZXQpICU+JQogIG11dGF0ZSh0YXJnZXRfbnVtID0gcmVjb2RlKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9IDQvMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNG1vIiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxMm1vIiA9IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9IDM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9IDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9IDYwKSwKICAgICAgICAgdGFyZ2V0X29yZCA9IHJlY29kZV9mYWN0b3IodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAibmV3Ym9ybnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSAiNC1kYXktb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMW1vIiA9ICIxLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAiMi1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gIjQtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNm1vIiA9ICI2LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSAiOS1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gIjEyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MThtbyIgPSAiMTgtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9ICIyLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9ICIzLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9ICI0LXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9ICI1LXllYXItb2xkcyIpKSAlPiUKICBnYXRoZXIoY2FwYWNpdHksIHJlc3BvbnNlLCAtYyhzdWJpZCwgc3RhcnRzX3dpdGgoInRhcmdldCIpKSkgJT4lCiAgbGVmdF9qb2luKGRfZGVtbyAlPiUKICAgICAgICAgICAgICBzZWxlY3QoUmVzcG9uc2VJZCwgUGFyZW50KSAlPiUKICAgICAgICAgICAgICByZW5hbWUoc3ViaWQgPSBSZXNwb25zZUlkLCBwYXJlbnQgPSBQYXJlbnQpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpKQpgYGAKCmBgYHtyLCByZXN1bHRzID0gImFzaXMifQpwYXJlbnRfY291bnRzIDwtIGRfZGVtbyAlPiUgCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgUGFyZW50KSAlPiUgCiAgcmVuYW1lKHN1YmlkID0gUmVzcG9uc2VJZCwgcGFyZW50ID0gUGFyZW50KSAlPiUKICBjb3VudChwYXJlbnQpICU+JSAKICBtdXRhdGUocHJvcG9ydGlvbiA9IG4vc3VtKG4pKQoKa25pdHI6OmthYmxlKHBhcmVudF9jb3VudHMsIGRpZ2l0cyA9IDMpCmBgYAoKYGBge3J9CmRfZGVtbyAlPiUKICBjb3VudChQYXJlbnQsIENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlKQpgYGAKCkdpdmVuIHRoZXNlIG51bWJlcnMsIEkgdGhpbmsgb3VyIGJlc3QgYmV0IGl0IGp1c3QgdG8gbG9vayBhdCBwYXJlbnRzIHZzLiBub24tcGFyZW50cywgYW5kIG5vdCB0cnkgdG8gc2VwYXJhdGUgb3V0IHBhcmVudHMgb2YgeW91bmcgY2hpbGRyZW4gKHRvbyBmZXchKS4KCmBgYHtyfQpzY29yZXNfUzIgPC0gZWZhX1MyJHNjb3JlcyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF90YXJnZXQiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX3RhcmdldCksCiAgICAgICAgIHRhcmdldCA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfdGFyZ2V0KSkgJT4lCiAgc2VsZWN0KC1zdWJpZF90YXJnZXQpICU+JQogIG11dGF0ZSh0YXJnZXRfbnVtID0gcmVjb2RlKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9IDQvMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNG1vIiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxMm1vIiA9IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9IDM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9IDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9IDYwKSwKICAgICAgICAgdGFyZ2V0X29yZCA9IHJlY29kZV9mYWN0b3IodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAibmV3Ym9ybnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSAiNC1kYXktb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMW1vIiA9ICIxLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAiMi1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gIjQtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNm1vIiA9ICI2LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSAiOS1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gIjEyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MThtbyIgPSAiMTgtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9ICIyLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9ICIzLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9ICI0LXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9ICI1LXllYXItb2xkcyIpKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLWMoc3ViaWQsIHN0YXJ0c193aXRoKCJ0YXJnZXQiKSkpICU+JQogIGxlZnRfam9pbihkX3BhcmVudCAlPiUgZGlzdGluY3Qoc3ViaWQsIHBhcmVudCkpICU+JQogIGxlZnRfam9pbihkX2NhdCAlPiUgZGlzdGluY3QoZmFjdG9yLCBmYWN0b3JfbmFtZXMpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpCmBgYAoKIyMjIFBsb3RzCgojIyMjIEZhY3RvciBzY29yZXMKCmBgYHtyfQojIGJvb3RzdHJhcHBlZCBtZWFucyBhbmQgOTUlIENJcwpkX3BhcmVudF9ib290IDwtIHNjb3Jlc19TMiAlPiUKICBmaWx0ZXIoIWlzLm5hKHBhcmVudCkpICU+JQogIGdyb3VwX2J5KHBhcmVudCwgdGFyZ2V0LCB0YXJnZXRfbnVtLCB0YXJnZXRfb3JkLCBmYWN0b3JfbmFtZXMpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInNjb3JlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIGRhdGEuZnJhbWUoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LjUsIGZpZy5hc3AgPSAwLjQ1fQpzY29yZXNfUzIgJT4lCiAgZmlsdGVyKCFpcy5uYShwYXJlbnQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gc2NvcmUsIGNvbG9yID0gcGFyZW50KSkgKwogIGZhY2V0X3dyYXAofiBmYWN0b3JfbmFtZXMsIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4wNSkgKwogIGdlb21fbGluZShkYXRhID0gZF9wYXJlbnRfYm9vdCwgYWVzKHkgPSBtZWFuLCBncm91cCA9IHBhcmVudCkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGRfcGFyZW50X2Jvb3QsIGZhdHRlbiA9IDEuNSwgIyBub3RlOiB0b28gY2xvc2UgdG8gZG9kZ2UKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHBhcmVudCksICNjb2xvciA9ICJibGFjayIsCiAgIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiBwb2x5KHgsIDMpIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCAxMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkRldmVsb3BtZW50YWwgdHJhamVjdG9yaWVzIG9mIGZhY3RvciBzY29yZXMsIGJ5IHBhcmVudCBzdGF0dXMiLAogICAgICAgc3VidGl0bGUgPSAiRXhhY3QgYWdlLCB1bnRyYW5zZm9ybWVkIiwKICAgICAgIGNvbG9yID0gInBhcmVudCBzdGF0dXM6ICIsCiAgICAgICB4ID0gInRhcmdldCBhZ2UgKG1vbnRocykiLCB5ID0gInNjb3JlIChOT1RFOiBzY2FsZXMgZGlmZmVyKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUuNSwgZmlnLmFzcCA9IDAuNDV9CnNjb3Jlc19TMiAlPiUKICBmaWx0ZXIoIWlzLm5hKHBhcmVudCkpICU+JQogIGdncGxvdChhZXMoeCA9IHRhcmdldF9udW0sIHkgPSBzY29yZSwgY29sb3IgPSBwYXJlbnQpKSArCiAgZmFjZXRfd3JhcCh+IGZhY3Rvcl9uYW1lcywgbmNvbCA9IDQsIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IHN1YmlkKSwgYWxwaGEgPSAwLjA1KSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkX3BhcmVudF9ib290LCBhZXMoeSA9IG1lYW4sIGdyb3VwID0gcGFyZW50KSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMykpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGRfcGFyZW50X2Jvb3QsIGZhdHRlbiA9IDEuNSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjMpKSArCiAgIyBnZW9tX3Ntb290aChhZXMoZ3JvdXAgPSBwYXJlbnQpLCAjY29sb3IgPSAiYmxhY2siLAogICMgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgZm9ybXVsYSA9ICJ5IH4gcG9seSh4LCAzKSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgMTIpLCB0cmFucyA9ICJzcXJ0IikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiRGV2ZWxvcG1lbnRhbCB0cmFqZWN0b3JpZXMgb2YgZmFjdG9yIHNjb3JlcywgYnkgcGFyZW50IHN0YXR1cyIsCiAgICAgICBzdWJ0aXRsZSA9ICJFeGFjdCBhZ2UsIHNxdWFyZS1yb290IHRyYW5zZm9ybWVkIiwKICAgICAgIGNvbG9yID0gInBhcmVudCBzdGF0dXM6ICIsCiAgICAgICB4ID0gImFnZSBhZnRlciBzcXVhcmUtcm9vdCB0cmFuc2Zvcm1hdGlvbiAobW9udGhzKSIsIAogICAgICAgeSA9ICJzY29yZSAoTk9URTogc2NhbGVzIGRpZmZlcikiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LjUsIGZpZy5hc3AgPSAwLjQ1fQpzY29yZXNfUzIgJT4lCiAgZmlsdGVyKCFpcy5uYShwYXJlbnQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0YXJnZXRfb3JkLCB5ID0gc2NvcmUsIGNvbG9yID0gcGFyZW50KSkgKwogIGZhY2V0X3dyYXAofiBmYWN0b3JfbmFtZXMsIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4wNSkgKwogIGdlb21fbGluZShkYXRhID0gZF9wYXJlbnRfYm9vdCwgYWVzKHkgPSBtZWFuLCBncm91cCA9IHBhcmVudCksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX3BhcmVudF9ib290LCBmYXR0ZW4gPSAxLjUsCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogICMgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gcGFyZW50KSwgI2NvbG9yID0gImJsYWNrIiwKICAjICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSAieSB+IHBvbHkoeCwgMykiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiRGV2ZWxvcG1lbnRhbCB0cmFqZWN0b3JpZXMgb2YgZmFjdG9yIHNjb3JlcywgYnkgcGFyZW50IHN0YXR1cyIsCiAgICAgICBzdWJ0aXRsZSA9ICJBZ2UgYXMgb3JkaW5hbCB2YXJpYWJsZSIsCiAgICAgICBjb2xvciA9ICJwYXJlbnQgc3RhdHVzOiAiLAogICAgICAgeCA9ICJhZ2UgKG9yZGluYWwpIiwgCiAgICAgICB5ID0gInNjb3JlIChOT1RFOiBzY2FsZXMgZGlmZmVyKSIpCmBgYAoKIyMjIyBDYXRlZ29yeSAnc3VtbWFyeSBzY29yZXMnCgpgYGB7cn0KIyBib290c3RyYXBwZWQgbWVhbnMgYW5kIDk1JSBDSXMKZF9jYXRfcGFyZW50X3Njb3JlZF9ib290IDwtIGRfY2F0X3Njb3JlZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHBhcmVudCkpICU+JQogIGdyb3VwX2J5KHBhcmVudCwgdGFyZ2V0LCB0YXJnZXRfbnVtLCB0YXJnZXRfb3JkLCBmYWN0b3IsIGZhY3Rvcl9uYW1lcykgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2NvcmUiKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNX0KZ2dwbG90KGRfY2F0X3BhcmVudF9zY29yZWRfYm9vdCwKICAgICAgIGFlcyh4ID0gdGFyZ2V0X251bSwgeSA9IHNjb3JlLCBjb2xvciA9IHBhcmVudCkpICsKICBmYWNldF93cmFwKH4gZmFjdG9yX25hbWVzLCBuY29sID0gNCwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc3ViaWQpLCBhbHBoYSA9IDAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRfY2F0X3BhcmVudF9zY29yZWRfYm9vdCwgCiAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgZ3JvdXAgPSBwYXJlbnQpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX2NhdF9wYXJlbnRfc2NvcmVkX2Jvb3QsIGZhdHRlbiA9IDEuNSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IGZhY3Rvcl9uYW1lcyksCiAgIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiBwb2x5KHgsIDMpIiwKICAjICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCAxMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMCwgMTApKSArCiAgbGFicyh0aXRsZSA9ICJEZXZlbG9wbWVudGFsIHRyYWplY3RvcmllcyBvZiBjYXRlZ29yeSAnc3VtbWFyeSBzY29yZXMnIiwKICAgICAgIHN1YnRpdGxlID0gIkV4YWN0IGFnZSwgdW50cmFuc2Zvcm1lZCIsCiAgICAgICB4ID0gInRhcmdldCBhZ2UgKG1vbnRocykiLAogICAgICAgeSA9ICJzY29yZSAoTk9URTogc2NhbGVzIGRpZmZlcikiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpnZ3Bsb3QoZF9jYXRfcGFyZW50X3Njb3JlZF9ib290LAogICAgICAgYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gc2NvcmUsIGNvbG9yID0gcGFyZW50KSkgKwogIGZhY2V0X3dyYXAofiBmYWN0b3JfbmFtZXMsIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gZF9jYXRfcGFyZW50X3Njb3JlZF9ib290LCAKICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCBncm91cCA9IHBhcmVudCkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGRfY2F0X3BhcmVudF9zY29yZWRfYm9vdCwgZmF0dGVuID0gMS41LAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSkgKwogICMgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gZmFjdG9yX25hbWVzKSwKICAjICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSAieSB+IHBvbHkoeCwgMykiLAogICMgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAsIDEyKSwgdHJhbnMgPSAic3FydCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMCwgMTApKSArCiAgbGFicyh0aXRsZSA9ICJEZXZlbG9wbWVudGFsIHRyYWplY3RvcmllcyBvZiBjYXRlZ29yeSAnc3VtbWFyeSBzY29yZXMnIiwKICAgICAgIHN1YnRpdGxlID0gIkV4YWN0IGFnZSwgc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24iLAogICAgICAgeCA9ICJhZ2UgYWZ0ZXIgc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24gKG1vbnRocykiLAogICAgICAgeSA9ICJzY29yZSAoTk9URTogc2NhbGVzIGRpZmZlcikiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpnZ3Bsb3QoZF9jYXRfcGFyZW50X3Njb3JlZF9ib290LAogICAgICAgYWVzKHggPSB0YXJnZXRfb3JkLCB5ID0gc2NvcmUsIGNvbG9yID0gcGFyZW50KSkgKwogIGZhY2V0X3dyYXAofiBmYWN0b3JfbmFtZXMsIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gZF9jYXRfcGFyZW50X3Njb3JlZF9ib290LCAKICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCBncm91cCA9IHBhcmVudCkpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IGRfY2F0X3BhcmVudF9zY29yZWRfYm9vdCwgZmF0dGVuID0gMS41LAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSkgKwogICMgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gZmFjdG9yX25hbWVzKSwKICAjICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSAieSB+IHBvbHkoeCwgMykiLAogICMgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwLCAxMCkpICsKICBsYWJzKHRpdGxlID0gIkRldmVsb3BtZW50YWwgdHJhamVjdG9yaWVzIG9mIGNhdGVnb3J5ICdzdW1tYXJ5IHNjb3JlcyciLAogICAgICAgc3VidGl0bGUgPSAiQWdlIGFzIGFuIG9yZGluYWwgdmFyaWFibGUiLAogICAgICAgeCA9ICJhZ2UgKG9yZGluYWwpIiwKICAgICAgIHkgPSAic2NvcmUgKE5PVEU6IHNjYWxlcyBkaWZmZXIpIikKYGBgCgpBbGwgb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgc3VnZ2VzdCB0aGF0LCByZWxhdGl2ZSB0byBub24tcGFyZW50cyAobiA9IGByIHBhcmVudF9jb3VudHMkbltwYXJlbnRfY291bnRzJHBhcmVudCA9PSAibm9uLXBhcmVudCJdWzFdYCksIHBhcmVudHMgKG4gPSBgciBwYXJlbnRfY291bnRzJG5bcGFyZW50X2NvdW50cyRwYXJlbnQgPT0gInBhcmVudCJdWzFdYCkgdGVuZGVkIHRvIHBlcmNlaXZlIGdyZWF0ZXIgYWJpbGl0aWVzLCBpbiBhbGwgZG9tYWlucyBleGNlcHQgZm9yIGJvZGlseSBzZW5zYXRpb25zLiBGb3IgYm90aCBuZWdhdGl2ZSBlbW90aW9ucyBhbmQgcG9zaXRpdmUvc29jaWFsIGVtb3Rpb25zLCB0aGlzIGRpZmZlcmVuY2UgaXMgZ3JlYXRlc3QgaW4gdGhlIG1pZC1yYW5nZSBvZiB0aGUgdGFyZ2V0IGFnZXMgKDEyLTI0IG1vbnRocyk7IGZvciBjb2duaXRpb24gJiBjb250cm9sLCBpdCdzIGdyZWF0ZXIgYXQgdGhlIG9sZGVyIGVuZCBvZiB0aGUgdGFyZ2V0IGFnZXMgKGUuZy4sIDMtNSB5ZWFycykuIEl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgaHVnZSBlZmZlY3QsIGJ1dCBpdCdzIGludHJ1aWdpbmcuCgojIyMgUmVncmVzc2lvbnMKClRoZXJlIGFyZSBtYW55IHdheXMgdGhhdCB3ZSBjb3VsZCBjaG9vc2UgdG8gbW9kZWwgdGhpcyAtIEknbGwgdHJ5IG91dCB0aGUgZmFjdG9yIHNjb3JlcyBmaXJzdCwgYWRhcHRpbmcgb3VyIHByaW1hcnkgcmVncmVzc2lvbiBtb2RlbHMgKG5vdCBpbiB0aGlzIG5vdGVib29rKS4KCmBgYHtyfQpjb250cmFzdHMoc2NvcmVzX1MyJHBhcmVudCkgPC0gY29udHIudHJlYXRtZW50KDIsIGJhc2UgPSAxKSAjIGJhc2VsaW5lOiBOT04tcGFyZW50cwpjb250cmFzdHMoc2NvcmVzX1MyJGZhY3RvcikgPC0gY29udHIuc3VtKDQpCmBgYAoKYGBge3J9CnIyIDwtIGxtZXIoc2NvcmUgfiB0YXJnZXRfbnVtICogZmFjdG9yICogcGFyZW50CiAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGZhY3RvciB8IHN1YmlkKSwKICAgICAgICAgICBzY29yZXNfUzIgJT4lCiAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpKQpzdW1tYXJ5KHIyKQpgYGAKClRoZSBsYXN0IHRocmVlIGNvZWZmaWNpZW50cyBoZXJlIGFyZSB3aGVyZSB0aGUgYWN0aW9uIGlzOiBBY2NvcmRpbmcgdG8gdGhpcyBtb2RlbCwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwYXJlbnRzIGFuZCBub24tcGFyZW50cyBpbiBwZXJjZWl2ZWQgZGV2ZWxvcG1lbnRhbCB0cmFqZWN0b3JpZXMgKGB0YXJnZXRfbnVtOnBhcmVudDJgLCB3aGljaCBpcyBub3Qgc2lnbmlmaWNhbnQgY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycykgaXMgZXhhZ2dlcmF0ZWQgaW4gdGhlIGRvbWFpbiBvZiBjb2duaXRpb24gYW5kIGNvbnRyb2wgKGB0YXJnZXRfbnVtOmZhY3RvcjI6cGFyZW50MmApIGFuZCBkaW1pbmlzaGVkIGluIHRoZSBkb21haW4gb2YgYm9kaWx5IHNlbnNhdGlvbnMgKGB0YXJnZXRfbnVtOmZhY3RvcjM6cGFyZW50MmApLgoKTGV0J3MgdHJ5IGFkZGluZyBwb2x5bm9taWFsIGVmZmVjdHM6CgpgYGB7cn0KcjMgPC0gbG1lcihzY29yZSB+IHBvbHkodGFyZ2V0X251bSwgMykgKiBmYWN0b3IgKiBwYXJlbnQKICAgICAgICAgICArIChwb2x5KHRhcmdldF9udW0sIDEpICsgZmFjdG9yIHwgc3ViaWQpLAogICAgICAgICAgIHNjb3Jlc19TMiAlPiUKICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikpCnN1bW1hcnkocjMpCmBgYAoKQSBsb3QgdG8gc29ydCB0aHJvdWdoIGhlcmUsIGJ1dCBoZXJlIGFyZSBzb21lIG9ic2VydmF0aW9uczoKCi0gQ29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycywgaXQgc2VlbXMgbGlrZSBwYXJlbnRzIG1pZ2h0IHBlcmNlaXZlIGV4YWdnZXJhdGVkIG5vbi1saW5lYXJpdGllcz8gKGBwb2x5KHRhcmdldF9udW0sIDMpMjpwYXJlbnQyYCBhbmQgYHBvbHkodGFyZ2V0X251bSwgMykzOnBhcmVudDJgKQotIENvbXBhcmVkIHRvIGNvbGxhcHNpbmcgYWNyb3NzIGZhY3RvcnMsIG5vdCBhIGxvdCBvZiBhZGRpdGlvbmFsIHBhcmVudCB2cy4gbm9uLXBhcmVudCBkaWZmZXJlbmNlcyBpbiBuZWdhdGl2ZSBlbW90aW9ucyAoZmFjdG9yIDEpCi0gQ29tcGFyZWQgdG8gY29sbGFwc2luZyBhY3Jvc3MgZmFjdG9ycywgcGFyZW50cyBwZXJjZWl2ZWQgbW9yZSBkcmFtYXRpYyAobGluZWFyKSBncm93dGggaW4gY29nbml0aW9uL2NvbnRyb2wgKGZhY3RvciAyOyBgcG9seSh0YXJnZXRfbnVtLCAzKTE6ZmFjdG9yMjpwYXJlbnQyYCkKLSBDb21wYXJlZCB0byBjb2xsYXBzaW5nIGFjcm9zcyBmYWN0b3JzLCBpbiB0aGUgZG9tYWluIG9mIGJvZGlseSBzZW5zYXRpb25zIChmYWN0b3IgMyksIHBhcmVudHMgcGVyY2VpdmVkIGxlc3MgZ3Jvd3RoIChgcG9seSh0YXJnZXRfbnVtLCAzKTE6ZmFjdG9yMzpwYXJlbnQyYCkuIEknbSBub3Qgc3VyZSBob3cgdG8gaW50ZXJwcmV0IHRoZSBkaWZmZXJlbmNlcyBpbiBub24tbGluZWFyaXR5IGhlcmUuCgpZb3UgY291bGQgaW1hZ2luZSByZS1ydW5uaW5nIGFueSBvZiB0aGVzZSB3aXRoIGEgc3F1YXJlLXJvb3QgdHJhbnNmb3JtYXRpb24gb24gdGFyZ2V0IGFnZSwgYW5kL29yIHdpdGggdGhlICdzdW1tYXJ5IHNjb3JlcycgYnkgY2F0ZWdvcnksIGJ1dCBJJ20gbm90IGdvaW5nIHRvIGRvIHRoYXQgcmlnaHQgbm93LiAKCgojIyBTdHVkeSAxCgojIyMgUHJlbGltaW5hcmllcwoKYGBge3IsIHJlc3VsdHMgPSAiYXNpcyJ9CnBhcmVudF9jb3VudHNfUzEgPC0gZGVtb19TMSAlPiUgCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgUGFyZW50KSAlPiUgCiAgcmVuYW1lKHN1YmlkID0gUmVzcG9uc2VJZCwgcGFyZW50ID0gUGFyZW50KSAlPiUKICBjb3VudChwYXJlbnQpICU+JSAKICBtdXRhdGUocHJvcG9ydGlvbiA9IG4vc3VtKG4pKQoKa25pdHI6OmthYmxlKHBhcmVudF9jb3VudHNfUzEsIGRpZ2l0cyA9IDMpCmBgYAoKYGBge3J9CnNjb3Jlc19TMSA8LSBlZmFfUzEkc2NvcmVzICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX3RhcmdldCIpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoIl8uKiQiLCAiIiwgc3ViaWRfdGFyZ2V0KSwKICAgICAgICAgdGFyZ2V0ID0gZ3N1YigiXi4qXyIsICIiLCBzdWJpZF90YXJnZXQpKSAlPiUKICBzZWxlY3QoLXN1YmlkX3RhcmdldCkgJT4lCiAgbXV0YXRlKHRhcmdldF9udW0gPSByZWNvZGUodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDBYbW8iID0gNC8zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDFtbyIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDZtbyIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDE4bW8iID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gMzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gNjApLAogICAgICAgICB0YXJnZXRfb3JkID0gcmVjb2RlX2ZhY3Rvcih0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9ICJuZXdib3JucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9ICI0LWRheS1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gIjEtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9ICIyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDRtbyIgPSAiNC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gIjYtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9ICI5LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MTJtbyIgPSAiMTItbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9ICIxOC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gIjIteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gIjMteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gIjQteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gIjUteWVhci1vbGRzIikpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtYyhzdWJpZCwgc3RhcnRzX3dpdGgoInRhcmdldCIpKSkgJT4lCiAgbGVmdF9qb2luKGRlbW9fUzEgJT4lIGRpc3RpbmN0KFJlc3BvbnNlSWQsIFBhcmVudCkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKHN1YmlkID0gUmVzcG9uc2VJZCwgcGFyZW50ID0gUGFyZW50KSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoc3ViaWQgPSBhcy5jaGFyYWN0ZXIoc3ViaWQpKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9uYW1lcyA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUjQiID0gIk5lZ2F0aXZlIGVtb3Rpb25zIChTMSBGNCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUjEiID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wgKFMxIEYxKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SMiIgPSAiQm9kaWx5IHNlbnNhdGlvbnMgKFMxIEYyKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SMyIgPSAiUG9zaXRpdmUvc29jaWFsIGVtb3Rpb25zIChTMSBGMykiKSwKICAgICAgICAgZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpCmBgYAoKIyMjIFBsb3RzCgojIyMjIEZhY3RvciBzY29yZXMKCmBgYHtyfQojIGJvb3RzdHJhcHBlZCBtZWFucyBhbmQgOTUlIENJcwpkX3BhcmVudF9ib290X1MxIDwtIHNjb3Jlc19TMSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBhcmVudCkpICU+JQogIGdyb3VwX2J5KHBhcmVudCwgdGFyZ2V0LCB0YXJnZXRfbnVtLCB0YXJnZXRfb3JkLCBmYWN0b3JfbmFtZXMpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInNjb3JlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIGRhdGEuZnJhbWUoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LjUsIGZpZy5hc3AgPSAwLjQ1fQpzY29yZXNfUzEgJT4lCiAgZmlsdGVyKCFpcy5uYShwYXJlbnQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gc2NvcmUsIGNvbG9yID0gcGFyZW50KSkgKwogIGZhY2V0X3dyYXAofiBmYWN0b3JfbmFtZXMsIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4wNSkgKwogIGdlb21fbGluZShkYXRhID0gZF9wYXJlbnRfYm9vdF9TMSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDUpLAogICAgICAgICAgICBhZXMoeSA9IG1lYW4sIGdyb3VwID0gcGFyZW50KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZF9wYXJlbnRfYm9vdF9TMSwgCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSA1KSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHBhcmVudCksICNjb2xvciA9ICJibGFjayIsCiAgIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiBwb2x5KHgsIDMpIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCAxMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMTAsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkRldmVsb3BtZW50YWwgdHJhamVjdG9yaWVzIG9mIGZhY3RvciBzY29yZXMsIGJ5IHBhcmVudCBzdGF0dXMgKFNUVURZIDEpIiwKICAgICAgIHN1YnRpdGxlID0gIkV4YWN0IGFnZSwgdW50cmFuc2Zvcm1lZCIsCiAgICAgICBjb2xvciA9ICJwYXJlbnQgc3RhdHVzOiAiLAogICAgICAgeCA9ICJ0YXJnZXQgYWdlIChtb250aHMpIiwgeSA9ICJzY29yZSAoTk9URTogc2NhbGVzIGRpZmZlcikiKQpgYGAKCkkgd29uJ3QgYm90aGVyIHRvIHJlLXBsb3Qgd2l0aCBkaWZmZXJlbnQgdHJlYXRtZW50cyBvZiBhZ2UsIHNpbmNlIHRoZXJlIGFyZSBvbmx5IHRocmVlIHRhcmdldCBhZ2VzIGhlcmUuCgojIyMjIENhdGVnb3J5ICdzdW1tYXJ5IHNjb3JlcycKCmBgYHtyfQojIG1ha2UgbmV3IGRhdGFmcmFtZQpkX2NhdF9TMSA8LSBkX2FsbF9TMSAlPiUKICByZW5hbWUoc3ViaWRfdGFyZ2V0ID0gWCkgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigiXy4qJCIsICIiLCBzdWJpZF90YXJnZXQpLAogICAgICAgICB0YXJnZXQgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX3RhcmdldCkpICU+JQogIHNlbGVjdCgtc3ViaWRfdGFyZ2V0KSAlPiUKICBtdXRhdGUodGFyZ2V0X251bSA9IHJlY29kZSh0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAwbW8iID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSA0LzMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMW1vIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAybW8iID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDRtbyIgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNm1vIiA9IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA5bW8iID0gOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MTJtbyIgPSAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MThtbyIgPSAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MjRtbyIgPSAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MzZtbyIgPSAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0NDhtbyIgPSA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0NjBtbyIgPSA2MCksCiAgICAgICAgIHRhcmdldF9vcmQgPSByZWNvZGVfZmFjdG9yKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAwbW8iID0gIm5ld2Jvcm5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDBYbW8iID0gIjQtZGF5LW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDFtbyIgPSAiMS1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAybW8iID0gIjItbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNG1vIiA9ICI0LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDZtbyIgPSAiNi1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA5bW8iID0gIjktbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxMm1vIiA9ICIxMi1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDE4bW8iID0gIjE4LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MjRtbyIgPSAiMi15ZWFyLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MzZtbyIgPSAiMy15ZWFyLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0NDhtbyIgPSAiNC15ZWFyLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0NjBtbyIgPSAiNS15ZWFyLW9sZHMiKSkgJT4lCiAgZ2F0aGVyKGNhcGFjaXR5LCByZXNwb25zZSwgLWMoc3ViaWQsIHN0YXJ0c193aXRoKCJ0YXJnZXQiKSkpICU+JQogIGxlZnRfam9pbihmYWN0b3JzX1MyKSAlPiUKICBsZWZ0X2pvaW4oZGVtb19TMSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoUmVzcG9uc2VJZCwgUGFyZW50KSAlPiUKICAgICAgICAgICAgICByZW5hbWUoc3ViaWQgPSBSZXNwb25zZUlkLCBwYXJlbnQgPSBQYXJlbnQpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGZhY3RvcikpICMgZHJvcCBleHRyYSBpdGVtcyBmcm9tIFMxIG5vdCBpbiBTMgpgYGAKCkFuZCBnZXQgYW4gYXZlcmFnZSAic2NvcmUiIGZvciBlYWNoIG9mIHRoZXNlIGZhY3RvcnMgZm9yIGVhY2ggcGFydGljaXBhbnQ6CgpgYGB7cn0KZF9jYXRfc2NvcmVkX1MxIDwtIGRfY2F0X1MxICU+JQogIGdyb3VwX2J5KHN1YmlkLCBwYXJlbnQsIAogICAgICAgICAgIHRhcmdldCwgdGFyZ2V0X251bSwgdGFyZ2V0X29yZCwgCiAgICAgICAgICAgZmFjdG9yLCBmYWN0b3JfbmFtZXMpICU+JQogIHN1bW1hcmlzZShzY29yZSA9IG1lYW4ocmVzcG9uc2UsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQojIGJvb3RzdHJhcHBlZCBtZWFucyBhbmQgOTUlIENJcwpkX2NhdF9wYXJlbnRfc2NvcmVkX2Jvb3RfUzEgPC0gZF9jYXRfc2NvcmVkX1MxICU+JQogIGZpbHRlcighaXMubmEocGFyZW50KSkgJT4lCiAgZ3JvdXBfYnkocGFyZW50LCB0YXJnZXQsIHRhcmdldF9udW0sIHRhcmdldF9vcmQsIGZhY3RvciwgZmFjdG9yX25hbWVzKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LjUsIGZpZy5hc3AgPSAwLjQ1fQpnZ3Bsb3QoZF9jYXRfcGFyZW50X3Njb3JlZF9ib290X1MxLAogICAgICAgYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gc2NvcmUsIGNvbG9yID0gcGFyZW50KSkgKwogIGZhY2V0X3dyYXAofiBmYWN0b3JfbmFtZXMsIG5jb2wgPSA0LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gZF9jYXRfcGFyZW50X3Njb3JlZF9ib290X1MxLAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gNSksCiAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgZ3JvdXAgPSBwYXJlbnQpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBkX2NhdF9wYXJlbnRfc2NvcmVkX2Jvb3RfUzEsCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSA1KSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlcikpICsKICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IGZhY3Rvcl9uYW1lcyksCiAgIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiBwb2x5KHgsIDMpIiwKICAjICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCAxMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMCwgMTApKSArCiAgbGFicyh0aXRsZSA9ICJEZXZlbG9wbWVudGFsIHRyYWplY3RvcmllcyBvZiBjYXRlZ29yeSAnc3VtbWFyeSBzY29yZXMnIiwKICAgICAgIHN1YnRpdGxlID0gIkV4YWN0IGFnZSwgdW50cmFuc2Zvcm1lZCIsCiAgICAgICB4ID0gInRhcmdldCBhZ2UgKG1vbnRocykiLAogICAgICAgeSA9ICJzY29yZSAoTk9URTogc2NhbGVzIGRpZmZlcikiKQpgYGAKCkxvb2tpbmcgcXVpY2tseSBhdCB0aGVzZSB0d28gdmlzdWFsaXphdGlvbnMgb2YgU3R1ZHkgMSwgSSdkIHNheSB0aGF0IHRoZXJlJ3MgYSBoaW50IG9mIHRoZSBzYW1lIHBhdHRlcm5zIGluIHRoZSBkb21haW5zIG9mIG5lZ2F0aXZlIGVtb3Rpb25zIGFuZCBwb3NpdGl2ZSBzb2NpYWwgZW1vdGlvbnMgKHBhcmVudHMgYXR0cmlidXRlZCBtb3JlIHRoYW4gbm9uLXBhcmVudHMsIGVzcGVjaWFsbHkgYXQgOSBtb250aHMpLCBhbmQgaW4gY29nbml0aW9uL2NvbnRyb2wgKHBhcmVudHMgYXR0cmlidXRlZCBtb3JlIHRoYW4gbm9uLXBhcmVudHMgYXQgNSB5ZWFycykuIFNvLCBnZW5lcmFsbHkgY29uc2lzdGVudD8KCkkgd29uJ3QgcnVuIHJlZ3Jlc3Npb24gYW5hbHlzZXMganVzdCBub3cuCg==